package com.ehsy.statement;

import com.dtflys.forest.http.ForestHeader;
import com.dtflys.forest.http.ForestHeaderMap;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.http.ForestResponse;
import com.ehsy.common.ResponseVo;
import com.ehsy.model.UserInfo;
import com.ehsy.service.RequestAndResponseServic;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;

/**
 * @author YanZhen_Li
 * @version 1.0
 * @title A8返回请求对象和响应对象
 * @description
 * @create 2024/6/18 12:10
 */
@SpringBootTest
public class A8返回请求对象和响应对象 {
    @Resource
    RequestAndResponseServic servic;
    /**
     * 返回请求对象，进行单独的额外配置
     */
    @Test
    void test001() {
        UserInfo userInfo = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        ForestRequest<?> request = servic.test1(userInfo);
        // 我们可以从中获取和设置部分信息，刻印对我们的请求参数做进一步的加工
        String path = request.path();
        System.out.println(path);
        // 手动执行发送请求，并设置返回的类型
        ResponseVo response = request.execute(ResponseVo.class);
        System.out.println(response);
    }

    /**
     * 返回响应体对象，进行单独的额外配置
     */
    @Test
    void test002() throws Exception {
        UserInfo userInfo = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        ForestResponse<ResponseVo<UserInfo>> response = servic.test2(userInfo);
        // ? 请求状态
        // 用isError方法去判断请求是否失败
        if (response.isError()) {
            System.out.println("哦！很抱歉，你的请求执行失败了。");
        }

        // 用isSuccess方法去判断请求是否成功
        if (response.isSuccess()) {
            System.out.println("你成功发起并接受了请求");
        }
        System.out.println("响应的状态码是：" + response.getStatusCode());
        // ? 响应头
        // 响应头获取方式
        ForestHeader header = response.getHeader("Content-Type");
        String name = header.getName();
        String value = header.getValue();
        // 根据响应头名称获取请求响应头列表
        List<ForestHeader> headers1 = response.getHeaders("Content-Type");
        ForestHeaderMap headers2 = response.getHeaders();
        // 根据响应头获取请求响应头值
        String val = response.getHeaderValue("Content-Type");
        // 根据响应头名称获取响应头值列表
        List<String> values = response.getHeaderValues("Content-Type");

        // ? 响应内容
        // 以字符串方式读取请求响应内容
        String text = response.readAsString();

        // getContent方法可以获取请求响应内容文本
        // 和readAsString方法不同的地方在于，getContent方法不会读取二进制形式数据内容，
        // 而readAsString方法会将二进制数据转换成字符串读取
        String content = response.getContent();

        // 获取反序列化成对象类型的请求响应内容
        // 因为返回类型为ForetReponse<ResponseVo<UserInfo>>, 其泛型参数为ResponseVo<UserInfo>
        // 所以这里也用ResponseVo<UserInfo>类型获取结果
        ResponseVo<UserInfo> result = response.getResult();

        // 以字节数组的形式获取请求响应内容
        byte[] byteArray = response.getByteArray();

        // 以输入流的形式获取请求响应内容
        InputStream in = response.getInputStream();

        System.out.println(result);
    }

    @Test
    void test003() {
        UserInfo userInfo = new UserInfo("张三", "18", "男", "上海", "13812341234", "123@qq.com", "123456");
        servic.test3(userInfo, (ResponseVo<UserInfo> result, ForestRequest request, ForestResponse response)->{
            System.out.println(result);
            System.out.println(response.getStatusCode()); // 获取请求响应状态码
            System.out.println(response.getContent()); // 获取请求的响应内容
            System.out.println(response.getResult()); // 获取方法返回类型对应的最终数据结果
        });
    }
}
